home *** CD-ROM | disk | FTP | other *** search
/ BCI NET / BCI NET Dec 94.iso / archives / programming / languages / ami_nuweb0.87c.lha / arena.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-12  |  963 b   |  46 lines

  1. #include "global.h"
  2. typedef struct chunk {
  3.   struct chunk *next;
  4.   char *limit;
  5.   char *avail;
  6. } Chunk;
  7. static Chunk first = { NULL, NULL, NULL };
  8. static Chunk *arena = &first;
  9. void *arena_getmem(size_t n)
  10. {
  11.   char *q;
  12.   char *p = arena->avail;
  13.   n = (n + 7) & ~7;             /* ensuring alignment to 8 bytes */
  14.   q = p + n;
  15.   if (q <= arena->limit) {
  16.     arena->avail = q;
  17.     return p;
  18.   }
  19.   {
  20.     Chunk *ap = arena;
  21.     Chunk *np = ap->next;
  22.     while (np) {
  23.       char *v = sizeof(Chunk) + (char *) np;
  24.       if (v + n <= np->limit) {
  25.         np->avail = v + n;
  26.         arena = np;
  27.         return v;
  28.       }
  29.       ap = np;
  30.       np = ap->next;
  31.     }
  32.     {
  33.       size_t m = n + 10000;
  34.       np = (Chunk *) malloc(m);
  35.       np->limit = m + (char *) np;
  36.       np->avail = n + sizeof(Chunk) + (char *) np;
  37.       np->next = NULL;
  38.       ap->next = np;
  39.       arena = np;
  40.       return sizeof(Chunk) + (char *) np;
  41.     }
  42.   }
  43. } void arena_free()
  44. {
  45.   arena = &first;